# backend/app.py

import logging  # 导入日志模块
from flask import Flask, render_template, jsonify  # 导入 Flask 及其相关功能
from flask_restful import Api  # 导入 Flask-Restful 的 API 类
from flask_jwt_extended import JWTManager, jwt_required, unset_jwt_cookies, get_jwt_identity  # 导入 JWT 相关工具
from flask_cors import CORS  # 导入跨域资源共享(CORS)模块
from flask_migrate import Migrate  # 导入数据库迁移工具
from .extensions import db  # 从扩展模块导入数据库对象
from dotenv import load_dotenv  # 导入加载环境变量的模块

def create_app():
    load_dotenv()  # 加载项目中的环境变量

    app = Flask(__name__)  # 创建 Flask 应用实例
    app.config.from_object('backend.config.Config')  # 从配置对象中加载配置信息

    # 初始化各种 Flask 扩展
    db.init_app(app)  # 初始化 SQLAlchemy
    migrate = Migrate(app, db)  # 初始化 Flask-Migrate，用于数据库迁移
    jwt = JWTManager(app)  # 初始化 JWT 认证管理器
    CORS(app, supports_credentials=True)  # 启用跨域资源共享，支持凭证传递

    # 创建 RESTful API
    api = Api(app)  # 初始化 API 实例

    # 导入并注册各模块的路由
    from .modules.authentication.routes import AuthenticationRoutes  # 导入用户认证模块的路由
    from .modules.forecasting.routes import ForecastingRoutes  # 导入预测模块的路由
    from .modules.visualization.routes import VisualizationRoutes  # 导入可视化模块的路由
    from .modules.userinterface.routes import UserInterfaceRoutes  # 导入用户界面模块的路由
    from .modules.dataimport.routes import DataImportRoutes  # 导入数据导入模块的路由

    # 注册各模块的路由到 API
    AuthenticationRoutes(api)
    ForecastingRoutes(api)
    VisualizationRoutes(api)
    UserInterfaceRoutes(api)
    DataImportRoutes(api)

    # 定义前端路由
    @app.route('/')
    def home():
        return render_template('login.html')  # 渲染登录页面

    @app.route('/data_upload')
    @jwt_required()  # 需要 JWT 认证
    def data_upload():
        return render_template('data_upload.html')  # 渲染数据上传页面

    @app.route('/forecast_generate')
    @jwt_required()  # 需要 JWT 认证
    def forecast_generate():
        return render_template('forecast_generate.html')  # 渲染预测生成页面

    @app.route('/visualization')
    @jwt_required()  # 需要 JWT 认证
    def visualization():
        return render_template('visualization.html')  # 渲染可视化页面

    @app.route('/user_manage')
    @jwt_required()  # 需要 JWT 认证
    def user_manage():
        current_user = get_jwt_identity()  # 获取当前用户身份信息
        if current_user['role'] != '管理员':  # 检查用户角色是否为管理员
            return jsonify({"message": "未授权访问"}), 403  # 未授权，返回 403 状态
        return render_template('user_manage.html')  # 渲染用户管理页面

    @app.route('/report_generate')
    @jwt_required()  # 需要 JWT 认证
    def report_generate():
        return render_template('report_generate.html')  # 渲染报告生成页面，修改为 UserInterface 模块中的模板

    @app.route('/change_password')
    @jwt_required()  # 需要 JWT 认证
    def change_password():
        return render_template('change_password.html')  # 渲染更改密码页面，确保此模板存在

    # API 登出路由
    @app.route('/api/auth/logout', methods=['POST'])
    @jwt_required()  # 需要 JWT 认证
    def api_logout():
        resp = jsonify({"logout": True})  # 创建注销响应
        unset_jwt_cookies(resp)  # 撤销 JWT Cookies
        return resp, 200  # 返回 200 状态的注销响应

    # 数据库表初始化
    with app.app_context():
        try:
            db.create_all()  # 创建所有数据库表
            app.logger.info("数据库表创建成功")  # 日志记录数据库表创建成功
        except Exception as e:
            app.logger.error(f"创建数据库表时出错：{e}")  # 捕捉异常，并记录错误日志

    with app.app_context():
        # 导入用户模型
        from backend.modules.authentication.models import User

        # 检查是否已有管理员账户
        if not User.query.filter_by(username='pzy').first():  # 查找是否存在用户名为 'pzy' 的用户
            admin_user = User(username='pzy', role='管理员')  # 创建管理员用户
            admin_user.set_password('pzy123')  # 设置管理员用户的密码
            db.session.add(admin_user)  # 将管理员用户添加到会话中
            db.session.commit()  # 提交会话到数据库
            app.logger.info("管理员账户已创建")  # 日志记录管理员账户创建成功

    return app  # 返回创建的应用实例

# 程序入口
if __name__ == '__main__':
    logging.basicConfig(level=logging.INFO)  # 设置日志记录级别为 INFO
    app = create_app()  # 创建应用实例
    app.run(debug=True, host='0.0.0.0')  # 运行应用，启用调试模式，监听所有可用的 IP 地址
